package HereClass;



import Exceptions.DadosDoUsuarioException;
import Exceptions.UsuarioException;
import Facade.FachadaDeArmazenamento;

/**
 * Classe que controla a criacao de usuarios
 * @author Caio, Ronaldo, Enio e Rafael
 * @version 5.1
 */
public class ManutencaoDeConta {

	
	private FachadaDeArmazenamento fachadaDeArmazenamento;
	private static ManutencaoDeConta instanciaUnicaMC;

	/**
	 * Manutencao Conta
	 */
	protected ManutencaoDeConta() {
		this.fachadaDeArmazenamento = FachadaDeArmazenamento.getInstance();
	}
	
	public static ManutencaoDeConta getInstance(){
		if (instanciaUnicaMC == null) 
			instanciaUnicaMC = new ManutencaoDeConta();
		return instanciaUnicaMC;
	}

	private void checaUserName(String userName) throws DadosDoUsuarioException {
		if (userName == null || userName.equals(""))
			throw new DadosDoUsuarioException("Username eh um dado obrigatorio.");
		if (fachadaDeArmazenamento.pesquisaUsuario(userName,1) != null)
			throw new DadosDoUsuarioException("O username jah existe.");
	}

	private static void checaNome(String nome) throws DadosDoUsuarioException {
		if (nome == null || nome.equals(""))
			throw new DadosDoUsuarioException("Nome eh um dado obrigatorio.");
	}
	

	private static void checaSenha(String senha) throws DadosDoUsuarioException {
		if (senha == null)
			throw new DadosDoUsuarioException("Senha eh um dado obrigatorio.");
		if (senha.length() < 6)
			throw new DadosDoUsuarioException("Senha deve ter no minimo 6 caracteres.");
		

	}

	private static void checaEmail(String email) throws DadosDoUsuarioException {
		if (email == null || email.equals(""))
			throw new DadosDoUsuarioException("E-mail eh um dado obrigatorio.");
		int i = email.length() - 10;
		if (i < 1 || !email.substring(i).contains("@") || !email.substring(i).contains(".com") )
			throw new DadosDoUsuarioException("E-mail invalido.");

	}


	/**
	 * Cria um usuario no banco de dados
	 * @param userName
	 * @param nome
	 * @param email
	 * @param senha
	 * @param telefone
	 * @throws Exception
	 */
	public boolean criarUsuario(String userName, String nome, String email,
			String senha, String telefone) throws DadosDoUsuarioException {
	
		checaUserName(userName);
		checaSenha(senha);
		checaNome(nome);
		checaEmail(email);
		
		Usuario user = new Usuario(userName, nome, email, senha, telefone);
		return fachadaDeArmazenamento.guardaUsuario(user);
	}
	
	
	/**
	 * Retorna o atributo pedido 
	 * @param userName
	 * @param atributo - atributo a ser retornado
	 * @return String
	 * @throws Exception
	 */
	public String getAtributoUsuario(String userName, String atributo) throws UsuarioException {
		
		Usuario usuario = getUsuario(userName);;
		
		if (atributo.equals("userName"))
			return usuario.getUserName();
		if (atributo.equals("nome"))
			return usuario.getNome();
		if (atributo.equals("email"))
			return usuario.getEmail();
		if (atributo.equals("senha"))
			return usuario.getSenha();
		if (atributo.equals("telefone"))
			return usuario.getTelefone();

		return null;
	}
	
	/**
	 * Atualiza o Usuario no banco de dados
	 * @param userName
	 * @param atributo - atributo a ser modificado
	 * @param modificado - valor do atributo modificado
	 * @throws Exception
	 */
	public void atualizarUsuario(String userName, String atributo, String modificado)
			throws DadosDoUsuarioException, UsuarioException {

		if (atributo.equals("userName"))
			throw new DadosDoUsuarioException("Nao eh permitido alterar o username.");
		
		
		Conectavel usuario = UsuariosConectados.getInstance().getUsuarioConectadoByUserName(userName);
		if (usuario == null)
			usuario = getUsuario(userName);
		
		if (atributo.equals("nome")) {
			checaNome(modificado);
			usuario.setNome(modificado);
		}
		
		if (atributo.equals("email")) {
			checaEmail(modificado);
			usuario.setEmail(modificado);
		}

		if (atributo.equals("senha")) {
			if (modificado == null || modificado.length() < 6)
				throw new DadosDoUsuarioException("Senha deve ter no minimo 6 caracteres.");
			usuario.setSenha(modificado);
		}
		if (atributo.equals("telefone")){
			usuario.setTelefone(modificado);
		}
		
		fachadaDeArmazenamento.atualizaBancoDeDados(usuario);

	}
	
	/**
	 * Remove Usuario do banco de dados pelo userName
	 * @param userName
	 * @throws Exception
	 */
	public void removerUsuario(String userName) throws UsuarioException{
		Usuario usuario = getUsuario(userName);;
		fachadaDeArmazenamento.deletaUsuario(usuario);
	}
	
	public Usuario getUsuario(String userName) throws UsuarioException{
		Usuario usuario = (Usuario)fachadaDeArmazenamento.pesquisaUsuario(userName,1);
		
		if(usuario!=null)
			return usuario;
		throw new UsuarioException("O usuario nao existe.");
	}
	

	public String getUsuarioPorNome(String nome, int indice) throws UsuarioException {
		Usuario user = (Usuario)fachadaDeArmazenamento.pesquisaUsuario(nome, indice);
		if(user == null)
			throw new UsuarioException("O usuario nao existe.");
		return user.getUserName();
		
	}
}
